#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>

#include <unistd.h>
#include <signal.h>

volatile sig_atomic_t quitflag;

void sig_int(int signo) {
	if (signo == SIGINT)
		printf("\ninterrupt\n");
	else if (signo == SIGQUIT)
		quitflag = 1;
}

int main(int argc, char const *argv[])
{
	sigset_t newmask, oldmask, zeromask;

	if (signal(SIGINT, sig_int) == SIG_ERR) {
		printf("signal error: %s\n", strerror(errno));
		return;
	}

	if (signal(SIGQUIT, sig_int) == SIG_ERR) {
		printf("signal error: %s\n", strerror(errno));
		return;
	}

	sigemptyset(&zeromask);
	sigemptyset(&newmask);
	sigaddset(&newmask, SIGQUIT);

	if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) {
		printf("sigprocmask error: %s\n", strerror(errno));
		return;
	}

	while (quitflag == 0)
		sigsuspend(&zeromask);

	quitflag = 0;
	if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) {
		printf("sigprocmask error: %s\n", strerror(errno));
		return;
	}

	return 0;
}